Attributes
Class Attributes
语法: 1
2class <name>:
<suite><name>上,作为当前环境的第一个作用域
类语句内部,赋值语句和def语句创建类属性,此时它们作为类属性放入类中,而非在作用域中
当class声明执行时,内部语句才会执行
类属性在类的所有实例之间共享 这样我们不必在每个创建的实例中存储此值,而只需要在类中存储一次
1 | class Account: |
0.02
0.02
Attribute Lookup
By Name
表达式提供对象,名称提供要查找的属性名称
但通过name查找将会查找多个位置,这取决于点表达式: -
首先执行点左侧表达式,生成该对象 -
<name>与该对象的实例属性匹配,如果存在该名称的属性,则返回值
- 如果没有找到,则在该对象的类中查找(类属性) -
返回的值是整个表达式的值,除非是一个函数,函数将会返回一个绑定的方法,对象填充为self
By Function
使用getatter函数,可以用属性名的字符串来查找对应属性
使用hasatter函数,可以判断是否具有该属性
getatter函数与点表达式查询方式相同
在对象中查询属性可能会返回实例属性或类属性之一
Attribute Assignment
左侧有点表达式的赋值语句会影响点表达式对应对象的属性 - 如果对象是一个实例,则赋值将设置一个实例属性 - 如果对象是一个类,则赋值将设置一个类属性
1 | tom.interest = 0.08 |
第一个语句将会在tom实例中寻找interest属性,没有找到,则在其中添加该属性 第二个语句将会在Account类中寻找interest属性,找到后将值修改为对应值
Method Calls
方法可使用点表达式调用 其中表达式可以是任何有效的python表达式
表达式的值是通过该表达式值对象中查找<name>而计算的属性值
1 | tom.deposit(10) |
Bound Methods
Terminlology
- 所有对象都有属性,均为name-value二元组
- 类是对象的一种, 故类也有属性
- 实例属性:一个实例的属性
- 类属性:类本身的属性,但仍可以从实例访问
- python中函数也是对象
- 绑定方法也是对象,即第一个参数为self的函数,该参数已经绑定到了一个实例
- 点表达式执行那些类属性是函数的绑定方法
Methods and Functions
python区分方法与函数 - 函数是从一开始就定义的 - 绑定方法在方法被调用时将一个函数和其对象绑定起来, 即Object+Function = Bound Method
1 | print(type(Account.deposit)) |
<class 'function'>
<class 'method'>
此时我们有两种方法调用 1. 作为函数调用,此时需要传递self和amount两个参数 2. 作为绑定方法调用,此时只需要传递amount参数
1 | Account.deposit(tom, 1001) |
2008